﻿namespace EFS.RC.Survey
{
	public partial class App : System.Windows.Application
	{
		public App()
		{
			this.Startup += this.Application_Startup;
			this.Exit += this.Application_Exit;
			this.UnhandledException += this.Application_UnhandledException;

			InitializeComponent();
		}

		#region Properties
		/// Property CMD: Get
		private System.String CMD
		{
			get
			{
				if (System.Windows.Browser.HtmlPage.Document.QueryString.ContainsKey("cmd"))
				{
					return EFS.Common.Functions.String.GetLowerTrimmedString(System.Windows.Browser.HtmlPage.Document.QueryString["cmd"]);
				}

				// none
				return null;
			}
		}

		/// Property ConversationGuid: Get
		private System.Guid ConversationGuid
		{
			get
			{
				return new System.Guid(EFS.Common.Functions.String.GetLowerTrimmedString(System.Windows.Browser.HtmlPage.Document.QueryString["cnv_guid"]));
			}
		}

		/// Property SurveyId: Get
		private System.Int32 SurveyId
		{
			get
			{
				return System.Int32.Parse(EFS.Common.Functions.String.GetLowerTrimmedString(System.Windows.Browser.HtmlPage.Document.QueryString["srv_id"]));
			}
		}

		/// Property ReviewTypeSessions: Get
		private EFS.RC.CC.CH.Entities.Surveys.SurveyInfo.eReviewType? ReviewTypeSessions
		{
			get
			{
				// only if set
				if (System.Windows.Browser.HtmlPage.Document.QueryString.ContainsKey("review_type_sessions"))
				{
					// get query string value
					System.String qsValue = EFS.Common.Functions.String.GetLowerTrimmedString(System.Windows.Browser.HtmlPage.Document.QueryString["review_type_sessions"]);

					// retValue
					EFS.RC.CC.CH.Entities.Surveys.SurveyInfo.eReviewType retValue = EFS.RC.CC.CH.Entities.Surveys.SurveyInfo.eReviewType.Agent;
					if (System.Enum.TryParse<EFS.RC.CC.CH.Entities.Surveys.SurveyInfo.eReviewType>(qsValue, true, out retValue))
					{
						return retValue;
					}
				}

				// none specified
				return null;
			}
		}

		/// Property RootVisualSwitch: Get
		private System.Windows.UIElement RootVisualSwitch
		{
			get
			{
				// default
				System.Windows.UIElement uiElem = null;

				// switch cmd
				switch (CMD)
				{
					case "score_ext":
						{
							// create new
							EFS.RC.Survey.ScoreExternal uiElemScoreExt =
								new EFS.RC.Survey.ScoreExternal(
									ConversationGuid,
									SurveyId);

							// set
							uiElem = uiElemScoreExt;
							break;
						}
					case "list_ext":
					case "srv_list_ext":
						{
							// create new
							EFS.RC.Survey.ListExternal uiElemListExt =
								new EFS.RC.Survey.ListExternal(
									ConversationGuid,
									ReviewTypeSessions);

							// set
							uiElem = uiElemListExt;
							break;
						}
					default:
						{
							System.Windows.Controls.TextBlock textBlock = new System.Windows.Controls.TextBlock();
							textBlock.Text = "The current request is unknown";
							uiElem = textBlock;
							break;
						}
				}

				// ok
				return uiElem;
			}
		}
		#endregion

		private void Application_Startup(object sender, System.Windows.StartupEventArgs e)
		{
			// init params
			EFS.RC.Survey.Common.Config.Main.Init(e);

			// set root visual
			this.RootVisual = RootVisualSwitch;
		}

		private void Application_Exit(object sender, System.EventArgs e)
		{

		}

		private void Application_UnhandledException(object sender, System.Windows.ApplicationUnhandledExceptionEventArgs e)
		{
			// If the app is running outside of the debugger then report the exception using
			// the browser's exception mechanism. On IE this will display it a yellow alert 
			// icon in the status bar and Firefox will display a script error.
			if (!System.Diagnostics.Debugger.IsAttached)
			{

				// NOTE: This will allow the application to continue running after an exception has been thrown
				// but not handled. 
				// For production applications this error handling should be replaced with something that will 
				// report the error to the website and stop the application.
				e.Handled = true;
				System.Windows.Deployment.Current.Dispatcher.BeginInvoke(delegate { ReportErrorToDOM(e); });
			}
		}

		private void ReportErrorToDOM(System.Windows.ApplicationUnhandledExceptionEventArgs e)
		{
			try
			{
				string errorMsg = e.ExceptionObject.Message + e.ExceptionObject.StackTrace;
				errorMsg = errorMsg.Replace('"', '\'').Replace("\r\n", @"\n");

				System.Windows.Browser.HtmlPage.Window.Eval("throw new Error(\"Unhandled Error in Silverlight Application " + errorMsg + "\");");
			}
			catch (System.Exception)
			{
			}
		}
	}
}
